
#include "Date.h"

bool Date::operator==(const Date& d) const
{
    return _year == d._year && _month == d._month && _day == d._day;
}
bool Date::operator!=(const Date& d) const 
{
    return !(*this == d);
}

bool Date::operator>(const Date& d) const 
{
    return !(*this <= d);
}
bool Date::operator>=(const Date& d) const 
{
    return *this == d || *this > d;
}
bool Date::operator<(const Date& d) const 
{
    if (_year < d._year)
    {
        return true;
    }
    else if (_year == d._year && _month < d._month)
    {
        return true;
    }
    else if (_year == d._year && _month == d._month && _day < d._day)
    {
        return true;
    }

    return false;
}
bool Date::operator<=(const Date& d) const 
{
    return *this < d || *this == d;
}

Date Date::operator+(int day) const 
{
    Date tmp(*this);
    tmp += day;

    return tmp;
}
Date& Date::operator+=(int day)
{
    _day += day;

    while (_day > GetMonthDay(_year, _month))
    {
        _day -= GetMonthDay(_year, _month);
        _month ++ ;

        if (_month == 13)
        {
            _month = 1;
            _year ++ ;
        }
    }

    return *this;
}
Date Date::operator-(int day) const 
{
    Date tmp(*this);
    tmp -= day;

    return tmp;
}
Date& Date::operator-=(int day)
{
    _day -= day;

    while (_day <= 0)
    {
        -- _month;
        
        if (_month == 0)
        {
            _month = 12;
            _year -- ;
        }

        _day += GetMonthDay(_year, _month);
    }

    return *this;
}
Date& Date::operator++() // 前置++
{
    *this += 1;
    return *this;
}
Date Date::operator++(int) // 后置++
{
    Date tmp(*this);
    *this += 1;

    return tmp;
}
Date& Date::operator--() // 前置--
{
    *this -= 1;
    return *this;
}
Date Date::operator--(int) // 后置--
{
    Date tmp(*this);
    *this -= 1;

    return tmp;
}

int Date::operator-(const Date& d) const // 两个日期相差多少天
{
    int flag = 1;
    Date max = *this;
    Date min = d;

    if (*this < d)
    {
        max = d;
        min = *this;
        flag = -1;
    }

    int count = 0;

    while (min != max)
    {
        count ++ ;
        ++ min;
    }

    return count * flag;
}
